﻿using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Controllers;
using System.Reflection;

namespace WebAPI中实现属性注入精简版.Code
{
    // 2. 自定义控制器激活器 - 核心注入逻辑
    public class PropertyInjectionActivator : IControllerActivator
    {
        public object Create(ControllerContext context)
        {
            // 获取控制器类型
            var controllerType = context.ActionDescriptor.ControllerTypeInfo.AsType();
            // 创建控制器实例（使用无参构造函数）
            var controller = Activator.CreateInstance(controllerType);

            // 注入所有标记了[Inject]的属性
            foreach (var property in controllerType.GetProperties())
            {
                if (property.GetCustomAttribute<InjectAttribute>() != null)
                {
                    // 从容器中获取服务并注入
                    var service = context.HttpContext.RequestServices.GetService(property.PropertyType);
                    property.SetValue(controller, service);
                }
            }

            return controller;
        }

        public void Release(ControllerContext context, object controller) { }
    }
}
